using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._CartographyTools._Annotation
{
    /// <summary>
    /// <para>Contour Annotation</para>
    /// <para>Creates annotation for contour features.</para>
    /// <para>创建等值线要素的注释。</para>
    /// </summary>    
    [DisplayName("Contour Annotation")]
    public class ContourAnnotation : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ContourAnnotation()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The contour line feature class for which the annotation will be created.</para>
        /// <para>将为其创建注记的等值线要素类。</para>
        /// </param>
        /// <param name="_out_geodatabase">
        /// <para>Output Geodatabase</para>
        /// <para>The workspace where the output feature classes will be saved. The workspace can be an existing geodatabase or an existing feature dataset.</para>
        /// <para>将保存输出要素类的工作空间。工作空间可以是现有地理数据库或现有要素数据集。</para>
        /// </param>
        /// <param name="_contour_label_field">
        /// <para>Contour Label Field</para>
        /// <para>The field in the input layer attribute table on which the annotation text will be based.</para>
        /// <para>输入图层属性表中注记文本所基于的字段。</para>
        /// </param>
        /// <param name="_reference_scale_value">
        /// <para>Reference Scale</para>
        /// <para>The scale that will be used as a reference for the annotation. This sets the scale on which all symbol and text sizes in the annotation will be based.</para>
        /// <para>将用作注释参考的比例。这将设置注释中所有符号和文本大小所基于的比例。</para>
        /// </param>
        /// <param name="_out_layer">
        /// <para>Output Layer Name</para>
        /// <para>The group layer that will contain the contour layer, the annotation, and the mask layer. When working in the Catalog pane, you can use the Save To Layer File tool to write the output group layer to a layer file. When using ArcGIS Pro, the tool adds the group layer to the display if the Add output datasets to an open map option is checked on the Geoprocessing tab on the Options dialog box. The group layer that is created is temporary and will not persist after the session ends unless the document is saved.</para>
        /// <para>将包含等值线图层、注记和蒙版图层的图层组。在目录窗格中工作时，可以使用保存至图层文件工具将输出图层组写入图层文件。使用 ArcGIS Pro 时，如果在选项 对话框的地理处理选项卡上选中了将输出数据集添加到打开的地图选项，则该工具会将图层组添加到显示中。创建的图层组是临时的，除非保存文档，否则在会话结束后不会保留。</para>
        /// </param>
        /// <param name="_contour_color">
        /// <para>Contour and Label Color</para>
        /// <para><xdoc>
        ///   <para>Specifies the color of the output contour layer and annotation features.</para>
        ///   <bulletList>
        ///     <bullet_item>Black—The output contour layer and annotation features will be drawn in black. This is the default.</bullet_item><para/>
        ///     <bullet_item>Brown—The output contour layer and annotation features will be drawn in brown.</bullet_item><para/>
        ///     <bullet_item>Blue—The output contour layer and annotation features will be drawn in blue.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输出等值线图层和注释要素的颜色。</para>
        ///   <bulletList>
        ///     <bullet_item>黑色—输出等值线图层和注记要素将绘制为黑色。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>棕色 - 输出等值线图层和注记要素将绘制为棕色。</bullet_item><para/>
        ///     <bullet_item>蓝色—输出等值线图层和注记要素将绘制为蓝色。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public ContourAnnotation(object _in_features, object _out_geodatabase, object _contour_label_field, double? _reference_scale_value, object _out_layer, _contour_color_value _contour_color)
        {
            this._in_features = _in_features;
            this._out_geodatabase = _out_geodatabase;
            this._contour_label_field = _contour_label_field;
            this._reference_scale_value = _reference_scale_value;
            this._out_layer = _out_layer;
            this._contour_color = _contour_color;
        }
        public override string ToolboxName => "Cartography Tools";

        public override string ToolName => "Contour Annotation";

        public override string CallName => "cartography.ContourAnnotation";

        public override List<string> AcceptEnvironments => ["annotationTextStringFieldLength", "outputCoordinateSystem", "referenceScale"];

        public override object[] ParameterInfo => [_in_features, _out_geodatabase, _contour_label_field, _reference_scale_value, _out_layer, _contour_color.GetGPValue(), _contour_type_field, _contour_alignment.GetGPValue(), _enable_laddering.GetGPValue(), _out_geodatabase2];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The contour line feature class for which the annotation will be created.</para>
        /// <para>将为其创建注记的等值线要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output Geodatabase</para>
        /// <para>The workspace where the output feature classes will be saved. The workspace can be an existing geodatabase or an existing feature dataset.</para>
        /// <para>将保存输出要素类的工作空间。工作空间可以是现有地理数据库或现有要素数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Geodatabase")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_geodatabase { get; set; }


        /// <summary>
        /// <para>Contour Label Field</para>
        /// <para>The field in the input layer attribute table on which the annotation text will be based.</para>
        /// <para>输入图层属性表中注记文本所基于的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour Label Field")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _contour_label_field { get; set; }


        /// <summary>
        /// <para>Reference Scale</para>
        /// <para>The scale that will be used as a reference for the annotation. This sets the scale on which all symbol and text sizes in the annotation will be based.</para>
        /// <para>将用作注释参考的比例。这将设置注释中所有符号和文本大小所基于的比例。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Reference Scale")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _reference_scale_value { get; set; }


        /// <summary>
        /// <para>Output Layer Name</para>
        /// <para>The group layer that will contain the contour layer, the annotation, and the mask layer. When working in the Catalog pane, you can use the Save To Layer File tool to write the output group layer to a layer file. When using ArcGIS Pro, the tool adds the group layer to the display if the Add output datasets to an open map option is checked on the Geoprocessing tab on the Options dialog box. The group layer that is created is temporary and will not persist after the session ends unless the document is saved.</para>
        /// <para>将包含等值线图层、注记和蒙版图层的图层组。在目录窗格中工作时，可以使用保存至图层文件工具将输出图层组写入图层文件。使用 ArcGIS Pro 时，如果在选项 对话框的地理处理选项卡上选中了将输出数据集添加到打开的地图选项，则该工具会将图层组添加到显示中。创建的图层组是临时的，除非保存文档，否则在会话结束后不会保留。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Layer Name")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_layer { get; set; }


        /// <summary>
        /// <para>Contour and Label Color</para>
        /// <para><xdoc>
        ///   <para>Specifies the color of the output contour layer and annotation features.</para>
        ///   <bulletList>
        ///     <bullet_item>Black—The output contour layer and annotation features will be drawn in black. This is the default.</bullet_item><para/>
        ///     <bullet_item>Brown—The output contour layer and annotation features will be drawn in brown.</bullet_item><para/>
        ///     <bullet_item>Blue—The output contour layer and annotation features will be drawn in blue.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定输出等值线图层和注释要素的颜色。</para>
        ///   <bulletList>
        ///     <bullet_item>黑色—输出等值线图层和注记要素将绘制为黑色。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>棕色 - 输出等值线图层和注记要素将绘制为棕色。</bullet_item><para/>
        ///     <bullet_item>蓝色—输出等值线图层和注记要素将绘制为蓝色。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour and Label Color")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _contour_color_value _contour_color { get; set; }

        public enum _contour_color_value
        {
            /// <summary>
            /// <para>Black</para>
            /// <para>Black—The output contour layer and annotation features will be drawn in black. This is the default.</para>
            /// <para>黑色—输出等值线图层和注记要素将绘制为黑色。这是默认设置。</para>
            /// </summary>
            [Description("Black")]
            [GPEnumValue("BLACK")]
            _BLACK,

            /// <summary>
            /// <para>Brown</para>
            /// <para>Brown—The output contour layer and annotation features will be drawn in brown.</para>
            /// <para>棕色 - 输出等值线图层和注记要素将绘制为棕色。</para>
            /// </summary>
            [Description("Brown")]
            [GPEnumValue("BROWN")]
            _BROWN,

            /// <summary>
            /// <para>Blue</para>
            /// <para>Blue—The output contour layer and annotation features will be drawn in blue.</para>
            /// <para>蓝色—输出等值线图层和注记要素将绘制为蓝色。</para>
            /// </summary>
            [Description("Blue")]
            [GPEnumValue("BLUE")]
            _BLUE,

        }

        /// <summary>
        /// <para>Contour Type Field</para>
        /// <para>The field in the input layer attribute table containing a value for the type of contour feature. An annotation class will be created for each type value.</para>
        /// <para>输入图层属性表中包含等值线要素类型值的字段。将为每个类型值创建一个注释类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour Type Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _contour_type_field { get; set; } = null;


        /// <summary>
        /// <para>Contour Alignment</para>
        /// <para><xdoc>
        ///   <para>Specifies how the annotation will be aligned to contour elevations. The annotation can be aligned to the contour elevations so that the top of the text is always placed uphill or downhill. These options allow the annotation to be placed upside down. The contour annotation can also be aligned to the page, ensuring that the text is never placed upside down.</para>
        ///   <bulletList>
        ///     <bullet_item>Align top of text to top of page— The annotation will be aligned to the page, ensuring that the text is never placed upside down. This is the default.</bullet_item><para/>
        ///     <bullet_item>Align top of text uphill—The annotation will be aligned to the contour elevations so that the top of the text is always placed uphill. This option allows the annotation to be placed upside down.</bullet_item><para/>
        ///     <bullet_item>Align top of text downhill—The annotation will be aligned to the contour elevations so that the top of the text is always placed downhill. This option allows the annotation to be placed upside down.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定注释与等值线高程的对齐方式。注释可以与等高线高程对齐，以便文本的顶部始终放置在上坡或下坡。这些选项允许将注释倒置放置。轮廓注释也可以与页面对齐，确保文本永远不会倒置。</para>
        ///   <bulletList>
        ///     <bullet_item>将文本顶部与页面顶部对齐 - 注释将与页面对齐，确保文本永远不会倒置。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>将文本的顶部向上对齐 - 注释将与等高线高程对齐，以便文本的顶部始终位于上坡。此选项允许将注释倒置放置。</bullet_item><para/>
        ///     <bullet_item>向下对齐文本的顶部 - 注释将与等值线高程对齐，以便文本的顶部始终位于下坡位置。此选项允许将注释倒置放置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour Alignment")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _contour_alignment_value _contour_alignment { get; set; } = _contour_alignment_value._PAGE;

        public enum _contour_alignment_value
        {
            /// <summary>
            /// <para>Align top of text  to top of page</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Align top of text  to top of page")]
            [GPEnumValue("PAGE")]
            _PAGE,

            /// <summary>
            /// <para>Align top of text uphill</para>
            /// <para>Align top of text uphill—The annotation will be aligned to the contour elevations so that the top of the text is always placed uphill. This option allows the annotation to be placed upside down.</para>
            /// <para>将文本的顶部向上对齐 - 注释将与等高线高程对齐，以便文本的顶部始终位于上坡。此选项允许将注释倒置放置。</para>
            /// </summary>
            [Description("Align top of text uphill")]
            [GPEnumValue("UPHILL")]
            _UPHILL,

            /// <summary>
            /// <para>Align top of text downhill</para>
            /// <para>Align top of text downhill—The annotation will be aligned to the contour elevations so that the top of the text is always placed downhill. This option allows the annotation to be placed upside down.</para>
            /// <para>向下对齐文本的顶部 - 注释将与等值线高程对齐，以便文本的顶部始终位于下坡位置。此选项允许将注释倒置放置。</para>
            /// </summary>
            [Description("Align top of text downhill")]
            [GPEnumValue("DOWNHILL")]
            _DOWNHILL,

        }

        /// <summary>
        /// <para>Enable Laddering</para>
        /// <para><xdoc>
        ///   <para>Specifies whether annotation will be placed in ladders. Placing annotation in ladders will place the text so it appears to step up and step down the contours in a straight path. These ladders will run from the top of a hill to the bottom, will not cross each other, will belong to a single slope, and will not cross any other slope.
        ///   <bulletList>
        ///     <bullet_item>Checked—Annotation will step up and down the contours in a straight path.  </bullet_item><para/>
        ///     <bullet_item>Unchecked—Annotation will not be placed up and down the contours in a straight path. This is the default.  </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>指定是否将批注放置在梯形图中。在梯子中放置注释将放置文本，使其看起来以直线路径向上和向下等高线。这些梯子将从山顶延伸到山脚，不会相互交叉，属于一个斜坡，也不会越过任何其他斜坡。
        ///   <bulletList>
        ///     <bullet_item>选中 - 注释将在等值线的直线路径上上下递增。</bullet_item><para/>
        ///     <bullet_item>未选中 - 注释不会在等值线的直线路径上上下放置。这是默认设置。 </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Enable Laddering")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _enable_laddering_value _enable_laddering { get; set; } = _enable_laddering_value._false;

        public enum _enable_laddering_value
        {
            /// <summary>
            /// <para>ENABLE_LADDERING</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ENABLE_LADDERING")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NOT_ENABLE_LADDERING</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NOT_ENABLE_LADDERING")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Output Workspace</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Workspace")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_geodatabase2 { get; set; }


        public ContourAnnotation SetEnv(object outputCoordinateSystem = null, object referenceScale = null)
        {
            base.SetEnv(outputCoordinateSystem: outputCoordinateSystem, referenceScale: referenceScale);
            return this;
        }

    }

}